package reflect;

import java.lang.reflect.Field;

public class ReflectDemo2 {
    public static void main(String[] args) throws Exception {
        //0.获取Person类的Class对象
        Class personClass = Person.class;
        Field[] fields = personClass.getFields();
        System.out.println("--------getFields()------------");
        //1.Field[] getFields()获取所有public修饰的成员变量
        for(Field f:fields){
            System.out.println(f);
        }

        System.out.println("--------getField(String)------------");
        //2.Field getField(String name), 传入字段（成员变量）的名称 （只能获取public修饰的字段）
        Field pid = personClass.getField("pid");
        System.out.println(pid);
        //获取成员变量pid的值
        Person person = new Person();
        Object value = pid.get(person);
        System.out.println(value);//pid = 0
        //设置pid的值
        pid.set(person,10);
        System.out.println(person);//pid = 10

        System.out.println("----------getDeclaredFields()-------------");
        //Field[] getDeclaredFields()获取所有的成员变量，不考虑修饰符
        Field[] fields1 = personClass.getDeclaredFields();
        for(Field f:fields1){
            System.out.println(f);
        }
        Field d = personClass.getDeclaredField("pname");//获取字段对象，忽略访问修饰符
        System.out.println(d);//private java.lang.String reflect.Person.pname
        //setAccessible,忽略访问权限修饰符的安全检查,之后才可以对字段对象进行get与set的操作
        d.setAccessible(true);//暴力反射  设置可访问性为真

        Object value2 = d.get(person);//有问题 获取不到对象的值 ，需要暴力反射
        System.out.println(value2);//null
        d.set(person,"hoan");
        Object value3 = d.get(person);
        System.out.println(value3);//hoan
    }
}
/**
 Class对象功能：
 * 获取功能：
 1. 获取成员变量们
 * Field[] getFields()
 * Field getField(String name)

 * Field[] getDeclaredFields()
 * Field getDeclaredField(String name)
 2. 获取构造方法们
 * Constructor<?>[] getConstructors()
 * Constructor<T> getConstructor(类<?>... parameterTypes)

 * Constructor<T> getDeclaredConstructor(类<?>... parameterTypes)
 * Constructor<?>[] getDeclaredConstructors()
 3. 获取成员方法们：
 * Method[] getMethods()
 * Method getMethod(String name, 类<?>... parameterTypes)

 * Method[] getDeclaredMethods()
 * Method getDeclaredMethod(String name, 类<?>... parameterTypes)

 4. 获取类名
 * String getName()



 */
